/**
 * 给定树，父子最多只能选其一，问最多选出多少个点
 * 令Di表示i子树最多选出来的点
 * Ui表示选i点i子树最多，Vi表示不选i点能得到的i子树最多
 * Ui = SIGMA{Vk, k是i的儿子}
 * Vi = SIGMA{Dk, k是i的儿子}
 * Di = max(Ui, Vi)
 * D[root]是答案
 */
#include <bits/stdc++.h>
using namespace std;

int N;
vector<vector<int>> G;
vector<int> A;
vector<int> D;
vector<int> Father;
vector<int> U, V;

void dfs(int u, int p){
    U[u] = A[u];
    for(auto i : G[u]){
        dfs(i, u);
        U[u] += V[i];
        V[u] += D[i];
    }
    D[u] = max(U[u], V[u]);
}

int main(){
    cin >> N;
    A.assign(N + 1, 0);
    Father.assign(N + 1, 0);
    G.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> A[i];
    for(int p,k,i=1;i<N;++i){
        cin >> p >> k;
        G[k].emplace_back(p);
        Father[p] = k;
    }
    D.assign(N + 1, 0);
    U.assign(N + 1, 0);
    V.assign(N + 1, 0);
    int root = 0;
    for(int i=1;i<=N;++i)if(Father[i]==0){root=i;break;}
//     cout << "Root = " << root << endl;
//     for(int i=1;i<=N;++i) cout << D[i] << " ";
//     cout << endl;
    dfs(root, 0);
    cout << D[root] << endl;
    return 0;
}
